alpha-mind的portfolio文件夹提供了构建组合的工具函数。
In [1]:
import numpy as np
from alphamind.portfolio.linearbuilder import linear_builder
"""
问题初始化
"""
# 假设有5个标的
n = 5
# 假设当前标的的权重
current_pos = np.random.randint(0, n, size=n)
current_pos = current_pos / current_pos.sum()
# 假设标的预期收益向量
expect_return = np.random.randn(n)
# 假设标的风险因子矩阵, 仅有一个风险因子
risk_factors = np.ones((n, 1))
# 约束条件
# 约束条件1 - 标的权重的上下限
weight_lb = np.zeros(n)
weight_ub = 0.5 * np.ones(n)
# 限制条件2 - 组合风险暴露的上下限
risk_lbound = np.ones(1)
risk_ubound = np.ones(1)
# 限制条件3 - 仓位调整的换手率上限(下限为0,故无需设置)
turn_over_target = 0.1
"""
问题求解
"""
status, fvalue, x_values = linear_builder(expect_return,
weight_lb,
weight_ub,
risk_factors,
(risk_lbound, risk_ubound),
turn_over_target,
current_pos,
method='ecos')
print('Optimization status - {}'.format(status))
print('Optimal expect return - {}'.format(fvalue))
print('Optimial portfolio weights - {}'.format(x_values))
print('Initial portfolio weights - {}'.format(current_pos))
print('Turn over amount - {}'.format(np.abs(x_values - current_pos).sum()))
其中
mean_variance_builder 接受的参数有
NOTE 1: 组合标的的权重上下限 lbound, ubound 是指绝对权重向量的上下限。
NOTE 2: 为了计算组合的方差,mean_variance_builder接受两种输入参数:
其中$\Sigma$对应入参中的risk_model['cov']。
由于一般情况下风险因子的数量小于标的股票的数量,所以$\omega_a^T X F X^T \omega_a$的时间复杂度要小于$\omega_a^T\Sigma \omega_a$, 所以第二种方法效率更高。
其中, $F$对应入参中的risk_model['factor_cov'], $\Delta$对应risk_model['idsync'],$X$对应risk_model['factor_loading']
In [2]:
import numpy as np
import pandas as pd
from alphamind.portfolio.meanvariancebuilder import mean_variance_builder
"""
问题初始化
"""
# 假设有3个标的
# 假设标的预期收益向量
expect_return = np.array([0.1, 0.2, 0.3])
# 假设收益的协方差矩阵
cov = np.array([[0.02, 0.01, 0.02],
[0.01, 0.02, 0.03],
[0.02, 0.03, 0.02]])
# 假设收益的非系统性方差(Idiosyncratic Risk)
ids_var = np.diag([0.01, 0.02, 0.03])
# 最终的协方差矩阵为
cov += ids_var
# 假设标的风险暴露矩阵, 有两个风险因子
risk_exposure = np.array([[1., 1., 1.],
[1., 0., 1.]]).T
# 假设基准指数的权重向量
bm = np.array([0.3, 0.3, 0.4])
# 约束条件
# 约束条件1 - 标的绝对权重的上下限
lbound = np.array([0., 0., 0.])
ubound = np.array([0.4, 0.4, 0.5])
# 约束条件2 - 组合风险暴露的上下限
risk_target = (np.array([bm.sum(), 0.3]), np.array([bm.sum(), 0.7]))
# 建立风险模型,假设直接使用标的的协方差矩阵计算组合的方差
risk_model = dict(cov=cov, factor_cov=None, factor_loading=None, idsync=None)
"""
问题求解
"""
status, _, x = mean_variance_builder(expect_return, risk_model, bm, lbound, ubound, risk_exposure, risk_target)
In [3]:
print('Optimal weight is {0}'.format(x))
print('Risk exposure of optimal potfolio is {0}'.format(x @ risk_exposure))
In [ ]: